#-*- coding: utf-8 -*-
import pymongo
import sys
import datetime

#功能为热点新闻推荐，可以自主选择推荐的集合
class HotRecommended:
    def __init__(self):
        reload(sys)
        sys.setdefaultencoding('utf8')


    def __connection(self, str):
        # 链接数据库
        connection = pymongo.MongoClient('localhost', 27017)
        db = connection['news']
        collection = db[str]
        return collection, db


    def __dataTransform(self, str):
        # 调整时间格式（主要用于网易新闻）
        if str[4] == '-' and str[7] == '-' and str[10] == ' ':
            return str
        else:
            s_temp = str.replace('/', '-')
            s_temp_mid = s_temp[0:5]
            s_temp_left = s_temp[6:10]  # 截取第1位到第10位字符
            s_temp_right = s_temp[10:19]  # 截取第11位到第19位字符
            return s_temp_left + '-' + s_temp_mid + ' ' + s_temp_right

    # 此函数处理了网易新闻中发布时间格式不规范的问题
    def hot_recommended(self, str):
        # 从数据库读取指定数据，以列表的方式返回
        collection, db = self.__connection(str)
        items = list(collection.find({}))
        # 将数据库中所有的东西存入名为items的列表list中

        # 将新闻按照时间排序
        order_items = sorted(items, key=lambda e: e.__getitem__('news_pub_time'), reverse=True)

        # 设定时间阈值为已发布新闻的最新时间的前两天
        newest_time = datetime.datetime.strptime(self.__dataTransform(order_items[0]['news_pub_time']),
                                                 '%Y-%m-%d %H:%M:%S')  # 获取当前最新新闻的时间
        delta = datetime.timedelta(days=2)  # 设置2天为时间周期
        time_threshold = newest_time - delta  # 设置热点新闻时间阈值

        # 删除发布时间为空的新闻，提取数据库中满足时间要求的新闻
        hot_item = [x for x in order_items if x['news_pub_time'] != '']
        hot_item_1 = [x for x in hot_item if
                      datetime.datetime.strptime(self.__dataTransform(x['news_pub_time']),
                                                 '%Y-%m-%d %H:%M:%S') >= time_threshold]

        # 将新闻先按照评论数排序，再按照时间排序
        hot_item_2 = sorted(hot_item_1, key=lambda e: (e.__getitem__('news_comment_num'), e.__getitem__('news_pub_time')),
                            reverse=True)

        # 建立名为hot_news的集合（表），用来存储热点新闻列表
        db.hot_news_wangyi.drop()  # 如果数据库中已经存在热点新闻集合，则删除

        hot_news_wangyi = db['hot_news_wangyi']  # 在数据库中，构建热点新闻集合
        hot_news_wangyi.insert_many(hot_item_2)  # 将热点新闻插入热点新闻集合

        # 构建热点新闻ID并返回
        new_id_list = []
        for dic in hot_item_2:
            new_id_list.append(dic)
        return new_id_list



# if __name__=="__main__":
#     #本模块测试
#     #返回值为热点表新闻的ID列表
#     #可以通过更换str来对其他集合的热点新闻进行推荐
#
#     H = HotRecommended()
#     # 此为对网易新闻热点的返回
#     str = 'wangyi_news'
#     item = H.hot_recommended(str)
#     print item